package jdk8.function.interfaceX;

import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * 函数常用方法
 **/
public class Demo05CommonMethod {
    public static void main(String[] args) {
        // Supplier : T get() 返回一个泛型参数指定类型的对象数据
        // 生产型接口
        String string = getString(() -> "小鸣");
        //System.out.println(string);

        // Coonsumer : void accept(T t) 泛型指定什么类型就消费什么类型
        // 消费型接口
        getName("小鸣", s -> {
//            System.out.println(s);
        });


        // Consumer : default Consumer<T> andThen(Consumer<? super T> after)
        // 连接两个Consumer接口 , 再进行消费
        getUpperAndLower("hello",
                s -> {
                    System.out.println(s.toUpperCase());    // HELLO
                },
                s -> {
                    System.out.println(s.toLowerCase());    // hello
                });

        // Predicate ： boolean test(T t) 对某种数据类型的数据进行判断
        boolean b = test("abcd", o -> o.length() > 5);
        System.out.println("Predicate: test: " + b);

        // Predicate 默认方法1：and  逻辑判断， 并且
        // default Predicate<T> and(Predicate<? super T> other)
        // 默认方法2: or
        // default Predicate<T> or(Predicate<? super T> other)
        // 默认方法3: 取反, 对判断结果进行取反
        // Predicate<T> negate()

    }

    // Supplier (供应商
    public static String getString(Supplier<String> supplier) {
        return supplier.get();
    }

    // Consumer (消费者
    public static void getName( String name, Consumer<String> consumer) {
        consumer.accept(name);
    }
    // Consumer  andThen
    public static void getUpperAndLower(String s, Consumer<String> con1, Consumer<String> con2) {
//        con1.accept(s);
//        con2.accept(s);
        // 使用andThen
        con1.andThen(con2).accept(s);
    }

    // Predicate :  boolean test(T t)
    public static boolean test(String str, Predicate<String> predicate) {
        return predicate.test(str);
    }



}
